package forms;

import beans.Examen;
import dao.DAOException;
import dao.ExamenDAO;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

public class AjouterExamenForm {
    
    private static final String CHAMP_ID_MATIERE = "selectMatiere";
    private static final String CHAMP_PROMOTION = "selectPromotion";
    private static final String CHAMP_EXAMEN = "libelle";
    private static final String CHAMP_DATE  = "dateExamen";
    private static final String CHAMP_ID_UTIL  = "idUtilisateur";
    
    private String              resultat;
    private Map<String, String> erreurs          = new HashMap<String, String>();
    
    private ExamenDAO      examenDao;

    public AjouterExamenForm( ExamenDAO examenDao ) {
        this.examenDao = examenDao;
    }

    public Map<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }
    
    public Examen creerExamen( HttpServletRequest request ) {  
        String idMatiere = getValeurChamp( request, CHAMP_ID_MATIERE );
        String nomExamen = getValeurChamp( request, CHAMP_EXAMEN );
        String dateExamen = getValeurChamp(request, CHAMP_DATE);
        String idUtil = getValeurChamp(request, CHAMP_ID_UTIL);
        String idPromotion = getValeurChamp(request, CHAMP_PROMOTION);
        
        Examen examen = new Examen();
        try {
            traiterExamen(nomExamen, examen);
            //Ajouter un contrôle de conformité de la date saisie directement en javascript
            traiterDateExamen (dateExamen,examen);
            examen.setProfesseur(Integer.parseInt(idUtil));
            examen.setMatiere(Integer.parseInt(idMatiere));
            examen.setPromotion(Integer.parseInt(idPromotion));
               
            if ( erreurs.isEmpty() ) {
                examenDao.creerExamen(examen);
                resultat = "L'examen a été crée avec succès.";
            } else {
                resultat = "Echec de création de l'examen, veuillez recommencer.";
            }
        } catch ( DAOException e ) {
            resultat = "Echec lors de la création de l'examen : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
            e.printStackTrace();
        } 
        return examen;
    }
    
    private void traiterExamen( String examen, Examen ex) {
        try {
            if (examen == null) {
                throw new FormValidationException( "Le nom de l'examen ne doit pas être vide." );
            }
            else if (examen.length() < 3 ) {
                throw new FormValidationException( "Le nom de l'examen doit contenir au moins 3 caractères." );
        }
        } catch ( FormValidationException e ) {
            setErreur( CHAMP_EXAMEN, e.getMessage() );
        }
        ex.setLibelleExamen(examen);
    }
    
    private void traiterDateExamen(String dateExamen, Examen ex) {
        try {
            if (dateExamen == null) {
                throw new FormValidationException( "Merci de rentrer une date d'examen." );
            }
            String[] dateE = dateExamen.split("/");
            if (dateE.length != 3 ) {
                throw new FormValidationException( "La date saisie n'est pas valide. Exemple de date: '08/07/1991'" );
            }
        } catch ( FormValidationException e ) {
            setErreur( CHAMP_DATE, e.getMessage() );
        }
        ex.setDateExam(dateExamen);
    }
    
    /**
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    /**
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     */
    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }

}
